package com.ruoyi.common.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.huifu.bspay.sdk.opps.core.request.V2MerchantBasicdataModifyRequest;
import com.huifu.bspay.sdk.opps.core.request.V2TradePaymentJspayRequest;
import com.huifu.bspay.sdk.opps.core.request.V2TradePaymentScanpayQueryRequest;
import com.huifu.bspay.sdk.opps.core.utils.DateTools;
import com.huifu.bspay.sdk.opps.core.utils.SequenceTools;
import com.ruoyi.common.config.HfuPayConfig;
import com.ruoyi.common.core.Identify;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.hfu.HfuBaseCommon;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

@Component
public class HfuPayUtils {

    //微信公众号
    public static final String T_JSAPI = "T_JSAPI";
    //微信小程序
    public static final String T_MINIAPP = "T_MINIAPP";
    //支付宝JS
    public static final String A_JSAPI = "A_JSAPI";
    //支付宝正扫
    public static final String A_NATIVE = "A_NATIVE";
    //银联正扫
    public static final String U_NATIVE = "U_NATIVE";
    //银联JS
    public static final String U_JSAPI = "U_JSAPI";
    //数字人民币正扫
    public static final String D_NATIVE = "D_NATIVE";
    //微信直连H5支付
    public static final String T_H5 = "T_H5";
    //微信APP支付
    public static final String T_APP = "T_APP";
    //微信正扫
    public static final String T_NATIVE = "T_NATIVE";
    //回调
    private static final String resultUrl = "http://admin.jxjzj2000.cloud:9101/hfu/hfuPayResult";

    public static String hFuPayByJs(String payType, String goodName, String price, String orderNo, String openId) throws Exception {

        // 1. 数据初始化
        HfuBaseCommon.doInit(HfuPayConfig.getMerchantConfig());

        // 2.组装请求参数
        V2TradePaymentJspayRequest request = new V2TradePaymentJspayRequest();
        // 请求日期
        request.setReqDate(DateTools.getCurrentDateYYYYMMDD());
        // 请求流水号
        request.setReqSeqId(SequenceTools.getReqSeqId32());
        // 商户号
        request.setHuifuId(HfuPayConfig.getMerchantConfig().getHuifuId());
        // 交易类型
        request.setTradeType(payType);
        // 交易金额
        request.setTransAmt(price);
        // 商品描述
        request.setGoodsDesc(goodName);

        // 设置非必填字段
        Map<String, Object> extendInfoMap = getExtendInfos(payType, goodName, price, orderNo, openId);
        request.setExtendInfo(extendInfoMap);

        // 3. 发起API调用
        Map<String, Object> response = HfuBaseCommon.doExecute(request);
        System.out.println("返回数据:" + JSONObject.toJSONString(response));

        if (response == null || !"00000100".equals(response.get("resp_code"))){
            throw new ServiceException("支付失败");
        }

        return JSONObject.toJSONString(response);
    }

    public static String hfuPayStatus(String partyOrderId, String payType, String openId) throws Exception {

        // 1. 数据初始化
        HfuBaseCommon.doInit(HfuPayConfig.getMerchantConfig());

        // 2.组装请求参数
        V2TradePaymentScanpayQueryRequest request = new V2TradePaymentScanpayQueryRequest();
        // 原机构请求日期
        request.setOrgReqDate(DateTools.getCurrentDateYYYYMMDD());
        // 商户号
        request.setHuifuId(HfuPayConfig.getMerchantConfig().getHuifuId());
        // 商户订单号线下POS、扫码机具发起的交易需要提供；&lt;font color&#x3D;&quot;green&quot;&gt;示例值：22577563652260773965&lt;/font&gt;
        request.setMerOrdId("");
        // 交易返回的全局流水号org_hf_seq_id，org_req_seq_id，out_trans_id，party_order_id四选一；&lt;br/&gt;&lt;font color&#x3D;&quot;green&quot;&gt;示例值：00290TOP1GR210919004230P853ac13262200000&lt;/font&gt;
        // request.setOrgHfSeqId("test");
        // 原机构请求流水号org_hf_seq_id，org_req_seq_id，out_trans_id，party_order_id四选一；&lt;br/&gt;&lt;font color&#x3D;&quot;green&quot;&gt;示例值：202110210012100005&lt;/font&gt;
        request.setOrgReqSeqId("");
        // 用户账单上的交易订单号org_hf_seq_id，org_req_seq_id，out_trans_id，party_order_id四选一；&lt;br/&gt;&lt;font color&#x3D;&quot;green&quot;&gt;示例值：092021091922001451301445517582&lt;/font&gt;；参见[用户账单说明](https://paas.huifu.com/partners/api/#/czsm/api_czsm_yhzd)
        request.setOutTransId("");
        // 用户账单上的商户订单号org_hf_seq_id，org_req_seq_id，out_trans_id，party_order_id四选一；&lt;br/&gt;&lt;font color&#x3D;&quot;green&quot;&gt;示例值：03232109190255105603561&lt;/font&gt;；参见[用户账单说明](https://paas.huifu.com/partners/api/#/czsm/api_czsm_yhzd)
        request.setPartyOrderId(partyOrderId);

        // 设置非必填字段
        Map<String, Object> extendInfoMap = getExtendInfos(payType,"", "", "", openId);
        request.setExtendInfo(extendInfoMap);

        // 3. 发起API调用
        Map<String, Object> response = null;
        try {
            response = HfuBaseCommon.doExecute(request);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        System.out.println("返回数据:" + JSONObject.toJSONString(response));

//        if (response == null || !"00000000".equals(response.get("resp_code"))){
//            System.out.println("支付查询返回数据 = " + response);
//
//        }
        return JsonUtils.toJsonString(response);
    }

    /**
     * 非必填字段
     * @return
     */
    private static Map<String, Object> getExtendInfos(String payType, String goodName, String price, String orderNo, String openId) {

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

        // 设置非必填字段
        Map<String, Object> extendInfoMap = new HashMap<>();
        // 交易有效期
        extendInfoMap.put("time_expire", LocalDateTime.now().plusMinutes(15).format(formatter));
        // 禁用信用卡标记
        extendInfoMap.put("limit_pay_type", "NO_CREDIT");
        // 是否延迟交易
        extendInfoMap.put("delay_acct_flag", "N");
        // 渠道号
//        extendInfoMap.put("channel_no", "");
        // 手续费扣款标志
        // extendInfoMap.put("fee_flag", "");
        // 营销补贴信息
        // extendInfoMap.put("combinedpay_data", getCombinedpayData());
        // 场景类型
        extendInfoMap.put("pay_scene", "02");
        // 安全信息
        extendInfoMap.put("risk_check_data", getRiskCheckData());
        // 设备信息
        extendInfoMap.put("terminal_device_data", getTerminalDeviceData());
        // 分账对象
        extendInfoMap.put("acct_split_bunch", getAcctSplitBunch());
        // 传入分帐遇到优惠的处理规则
        extendInfoMap.put("term_div_coupon_type", "0");

        if (A_NATIVE.equals(payType)){
            // 支付宝扩展参数集合
            extendInfoMap.put("alipay_data", getAlipayData(goodName, price, orderNo));
        }
        else if (T_JSAPI.equals(payType)){
            //微信拓展参数集合
            extendInfoMap.put("wx_data", getWxData(openId));
        }

        // 银联参数集合
        // extendInfoMap.put("unionpay_data", getUnionpayData());
        // 数字人民币参数集合
        // extendInfoMap.put("dc_data", getDcData());
        // 商户贴息标记
        extendInfoMap.put("fq_mer_discount_flag", "N");
        // 异步通知地址
        extendInfoMap.put("notify_url", resultUrl);
        // 备注
        extendInfoMap.put("remark", "");
        // 账户号
        // extendInfoMap.put("acct_id", "");
        return extendInfoMap;
    }


    private static String getRiskCheckData() {
        JSONObject dto = new JSONObject();
        // ip地址
        dto.put("ip_addr", "180.167.105.130");
        // 基站地址
        dto.put("base_station", "192.168.1.1");
        // 纬度
        dto.put("latitude", "33.3");
        // 经度
        dto.put("longitude", "33.3");

        return dto.toJSONString();
    }


    private static String getTerminalDeviceData() {
        JSONObject dto = new JSONObject();
        // 商户设备类型
        // dto.put("mer_device_type", "test");
        // 汇付机具号
        dto.put("devs_id", "SPINTP357338300264411");
        // 设备类型
        dto.put("device_type", "1");
        // 交易设备IP
        dto.put("device_ip", "10.10.0.1");
        // 交易设备MAC
        dto.put("device_mac", "");
        // 交易设备IMEI
        dto.put("device_imei", "");
        // 交易设备IMSI
        dto.put("device_imsi", "");
        // 交易设备ICCID
        dto.put("device_icc_id", "");
        // 交易设备WIFIMAC
        dto.put("device_wifi_mac", "");
        // 交易设备GPS
        dto.put("device_gps", "192.168.0.0");
        // 商户终端应用程序版本
        // dto.put("app_version", "");
        // SIM 卡卡号
        // dto.put("icc_id", "");
        // 商户终端实时经纬度信息
        // dto.put("location", "");
        // 商户交易设备IP
        // dto.put("mer_device_ip", "");
        // 移动国家代码
        // dto.put("mobile_country_cd", "");
        // 移动网络号码
        // dto.put("mobile_net_num", "");
        // 商户终端入网认证编号
        // dto.put("network_license", "");
        // 商户终端序列号
        // dto.put("serial_num", "");

        return dto.toJSONString();
    }


    private static String getAcctSplitBunch() {
        JSONObject dto = new JSONObject();
        // 分账明细
//        dto.put("acct_infos", getAcctInfosRucan());

        return dto.toJSONString();
    }

    private static String getAlipayData(String goodName, String price, String orderNo) {
        JSONObject dto = new JSONObject();
        // 买家的支付宝唯一用户号
        dto.put("buyer_id", "2088502835860454");
        // 支付宝的店铺编号
        dto.put("alipay_store_id", "");
        // 买家支付宝账号
        dto.put("buyer_logon_id", "");
        // 业务扩展参数
        dto.put("extend_params", getExtendParams());
        // 订单包含的商品列表信息
        dto.put("goods_detail", getGoodsDetail(goodName, price, orderNo));
        // 商户原始订单号
        dto.put("merchant_order_no", orderNo);
        // 商户操作员编号
        dto.put("operator_id", "001");
        // 销售产品码
        dto.put("product_code", orderNo);
        // 卖家支付宝用户号
        dto.put("seller_id", "string");
        // 商户门店编号
        dto.put("store_id", "");

        return dto.toJSONString();
    }

    private static JSON getExtendParams() {
        JSONObject dto = new JSONObject();
        // 卡类型
        dto.put("card_type", "");
        // 支付宝点餐场景类型
        dto.put("food_order_type", "qr_order");
        // 花呗分期数
        dto.put("hb_fq_num", "");
        // 花呗卖家承担的手续费百分比
        dto.put("hb_fq_seller_percent", "");
        // 行业数据回流信息
        dto.put("industry_reflux_info", "string");
        // 停车场id
        dto.put("parking_id", "123wsx");
        // 系统商编号
        dto.put("sys_service_provider_id", "1111111");
        // 信用卡分期资产方式
        // dto.put("fq_channels", "");

        return dto;
    }

    private static JSON getGoodsDetail(String goodName, String price, String orderNo) {
        JSONObject dto = new JSONObject();
        // 商品的编号
        dto.put("goods_id", orderNo);
        // 商品名称(元)
        dto.put("goods_name", goodName);
        // 商品单价
        dto.put("price", price);
        // 商品数量
        dto.put("quantity", "1");
        // 商品描述信息
        dto.put("body", goodName);
        // 商品类目树
        dto.put("categories_tree", "string");
        // 商品类目
        dto.put("goods_category", "");
        // 商品的展示地址
        dto.put("show_url", "");

        JSONArray dtoList = new JSONArray();
        dtoList.add(dto);
        return dtoList;
    }

    private static String getWxData(String openId) {
        JSONObject dto = new JSONObject();
        // 子商户公众账号id
         dto.put("sub_appid", "wx628300e827d81d58");
        // 用户标识
         dto.put("openid", "");
        // 子商户用户标识
         dto.put("sub_openid", openId);
        // 设备号
         dto.put("device_info", "");
        // 附加数据
         dto.put("attach", "");
        // 商品详情
         dto.put("detail", getDetail());
        // 场景信息
         dto.put("scene_info", getSceneInfo());
        // 订单优惠标记
        dto.put("goods_tag", "");
        // 实名支付
        dto.put("identity", "");
        // 开发票入口开放标识
        dto.put("receipt", "");
        // 商品描述
        dto.put("body", "");
        // 终端ip
        dto.put("spbill_create_ip", "");

        return dto.toJSONString();
    }

    private static JSON getDetail() {
        JSONObject dto = new JSONObject();
        // 单品列表
         dto.put("goods_detail", getGoodsDetailWxRucan());
        // 订单原价
         dto.put("cost_price", "");
        // 商品小票ID
         dto.put("receipt_id", "");

        return dto;
    }

    private static JSON getSceneInfo() {
        JSONObject dto = new JSONObject();
        // 门店信息
//         dto.put("store_info", getStoreInfo());

        return dto;
    }

    private static JSON getGoodsDetailWxRucan() {
        JSONObject dto = new JSONObject();
        // 商品编码
         dto.put("goods_id", "6934572310301");
        // 商品名称
         dto.put("goods_name", "太龙双黄连口服液");
        // 商品单价
         dto.put("price", "43");
        // 商品数量
         dto.put("quantity", "1");
        // 微信侧商品编码
         dto.put("wxpay_goods_id", "12235413214070356458063");

        JSONArray dtoList = new JSONArray();
        dtoList.add(dto);
        return dtoList;
    }

    private static JSON getStoreInfo() {
        JSONObject dto = new JSONObject();
//        // 门店id
//         dto.put("id", "");
//        // 门店名称
//         dto.put("name", "");
//        // 门店行政区划码
//         dto.put("area_code", "");
//        // 门店详细地址
//         dto.put("address", "");

        JSONArray dtoList = new JSONArray();
        dtoList.add(dto);
        return dtoList;
    }

    private static String getAcctInfosRucan() {
        JSONObject dto = new JSONObject();
        // 分账金额
//        dto.put("div_amt", "0.10");
        // 补分账方ID
//        dto.put("huifu_id", HfuPayConfig.getMerchantConfig().getHuifuId());

//        JSONArray dtoList = new JSONArray();
//        dtoList.add(dto);
        return dto.toJSONString();
    }


}
